import numpy as np
from scipy.fftpack import fft
import matplotlib.pyplot as plt
import cv2 as cv


def myfft_function(signal, begin, end, p):  # p代表指定频率下
    N = end - begin  # 采样点数
    sample_freq = 20  # 采样频率 20 Hz, 大于两倍的最高频率
    N_2 = int(N / 2)

    fft_data = fft(signal)

    # # 计算幅值
    # # 在python的计算方式中，fft结果的直接取模和真实信号的幅值不一样。
    # # 对于非直流量的频率，直接取模幅值会扩大N/2倍， 所以需要除了N乘以2。
    # # 对于直流量的频率(0Hz)，直接取模幅值会扩大N倍，所以需要除了N。
    # fft_amp0 = np.array(np.abs(fft_data) / N * 2)  # 用于计算双边谱
    # fft_amp0[0] = 0.5 * fft_amp0[0]
    # fft_amp = fft_amp0[0:N_2]  # 单边谱

    # 计算相位
    phase_spectrum = np.angle(fft_data, deg=False)  # deg=True表示返回的是角度值，否则是弧度值
    fft_pha = phase_spectrum[0:N_2]
    # 计算频谱的频率轴
    list1 = np.array(range(0, int(N / 2)))
    freq = sample_freq * list1 / N  # 单边谱的频率轴
    k = int(p / sample_freq * N)  # 这里的k：因为fft_pha数组共有N个，数组中从每个数分别代表0到20Hz所对应的复数值
    return fft_pha[k]
